package enumdemo;

// 测试枚举类型的反射

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class TestEnumReflect {
    public static void reflectPrivateConstructor() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        // 获取Class对象
        Class<?> c = Class.forName("enumdemo.TestEnum");
        // 获取私有构造方法
        //Constructor<?> constructor = c.getDeclaredConstructor(String.class,int.class);
        // 修改：
        Constructor<?> constructor = c.getDeclaredConstructor(String.class,int.class,String.class,int.class);

        // 进行确认
        constructor.setAccessible(true);
        // 创建对象：注意返回类型+强转
        TestEnum testEnum = (TestEnum) constructor.newInstance("骚粉",8);
        // 打印
        System.out.println(testEnum);
    }

    public static void main(String[] args) throws ClassNotFoundException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
        reflectPrivateConstructor();
        // 结果：报错
        // 为什么会报错：因为自定义枚举类默认继承于Enum类，而其构造方法就是带两个参数String,int的，
        // 所以在自定义枚举中重写构造方法时，是会默认在构造方法第一行调用super();拿到Enum的构造方法
        // 此时如果想要调用自定义类中的私有构造方法，就要在传入重写后的构造方法的参数类型
        // 也就是去修改反射方法中的getConstructor方法：如上

        // 在修改之后，会出现：不能反射枚举对象 的字样！
        // 在根据提升点到源码之后会发现：
        // 如果是枚举就会抛出： Cannot reflectively create enum objects 异常
        // 说明：反射不了枚举！！
    }
}
